A packet flow entering a network is routed from one router to the next until the packet flow reaches its destination. At any given time, there may be many packet flows traversing the network between many different sources and destinations. To keep track of the packet flows, each router may establish a logical queue for each packet flow the router is forwarding. The logical queue is a logical construct established within software of the router to maintain order and keep track of the individual packets of each packet flow.
If the rate of packets arriving at a router along a flow exceeds the rate of packets departing the router along the flow, the packets are temporarily buffered in a queue within the router. Due to memory constraints, often the temporarily buffered packets are enqueued into a circular queue having a limited number of slots for buffering the packets. As each packet arrives at the router it is enqueued into an available slot of the circular queue following the last enqueued slot. As each packet departs the router it is dequeued thereby generating a new available slot. However, if the packet arrival rate is greater than the packet departure rate for an extended period of time, the circular queue can become full, resulting in an overflow condition where newly arriving packets overwrite pending packets that have not yet been dequeued for departure. Therefore it is critical to track and prevent overflow conditions.
Often, pointers are used to keep track of the last enqueued slot (“LES”) and the current dequeue slot (“CDS”). As packets arrive and depart the circular queue, one or more LES pointers and a CDS pointer migrate along the circular queue until they reach the end of the circular queue. Once a pointer reaches the last slot of the circular queue, it wraps back to the first slot and continues therefrom.
Due to the wrapping nature of circular queues, it is important to determine whether a LES pointer has wrapped the circular queue and an overflow condition is imminently approaching or whether the CDS pointer has simply passed the LES pointer and the circular queue is empty. Thus, preventing overflow conditions requires careful monitoring of wrapping events.
Determining whether a circular queue is empty presents another issue. One method to determine whether a circular queue is empty is to maintain an enqueue count and a dequeue count for each logical queue buffered in a circular queue. Each time an packet arriving at the router along a packet flow is enqueued into the circular queue its enqueue count in incremented. Similarly, each time a packet from a logical queue is dequeued from the circular queue for departure, its dequeue count is incremented. Taking the difference between the enqueue count and the dequeue count can determine whether the particular logical queue buffered in the circular queue is empty.
However, maintaining accurate enqueue counts and dequeue counts can be difficult in high-speed networks, such as optical carrier (“OC”) networks. If fact, in some high-speed networks, the writes to memory to update the dequeue count can lag behind the actual dequeue count by as many as 16 slots.